Navigation APIがlib.dom.d.tsに採用されるまでの道のり
from:TSKaigi 2026プロポーザル案
https://2026.tskaigi.org/talks/33.png
Navigation APIがlib.dom.d.tsに採用されるまでの道のり | TSKaigi 2026
プロポーザル
皆さんは「Navigation API」をご存じでしょうか?
SPAのクライアントサイドルーティングを実現するために使われるHistory APIの後継のWeb APIです。昨年のInteropプロジェクトでの採用を経て、今年1月よりすべての主要ブラウザにて利用可能になりました。
しかしこのような最新のWeb APIを使おうとしたら型が未定義で、自らinterface Windowを拡張した経験は皆さんはありませんか?
本セッションでは、Navigation APIの概要を紹介しつつ、普段何気なく利用しているDOM APIがどのようなフローでTypeScriptでの型定義(lib.dom.d.ts)に採用されるのかを解説します。
この発表を通じて、Web標準の技術が「型」として届けられるまでの裏側を知り、最新技術をより安全かつ深く理解して扱えるようになることを目指します。
トーク概要
今日の持ち帰れる内容の説明
Navigation APIについて
新しいDOM APIの型はどのように更新されるのか
Navigation APIについて
クライアントサイドルーティングはこれまでHistory APIで行って来たが柔軟性や固有の制約によって扱いづらいものであった
それを改善するために生まれたものがNavigation API
ユーザーの履歴が明確に残り取り出しやすくなった
インターセプト処理により遷移前に明示的に処理を差し込むことが可能
ページ遷移時の読み込み処理が入るので「遷移していること」が明示的になった
ナビゲーションにはformの送信も含まれるので送信処理のときに差し込んだりページ離脱前の確認処理も差し込めたりする
参考: https://shoken3207.github.io/slides/2026-05-navigation-api/
Web APIにまつわる型情報はどこにある?
TypeScriptの場合はlib: ['dom']に内包されている
TypeScript 5までにはNavigation APIの型情報はなかった
DOM APIでの型情報がなかったらどうするのか
DefinitelyTypedで登録されているものを使う
https://www.npmjs.com/package/@types/dom-navigation
@types/webを使用する
TypeScript 4.5以降のlib replacement機能を使用してインストール
code:sh
pnpm add -D @typescript/lib-dom@npm:@types/web
パッケージに存在しない場合
自前でinterface Windowで拡張・パッケージ化
@ts-ignoreにて一時的に無視・回避
TypeScriptに内包されているDOM APIはどのように更新されるのか?
参考
TypeScript で Web API の利用を検知したい
lib.dom.d.tsがどのように更新されるか調べてみた
https://github.com/microsoft/TypeScript-DOM-lib-generator を使用
src/build/bcd.tsで@mdn/browser-compat-dataよりブラウザ互換性のデータを使用
基準
If there is, see the browser compatibility section and check whether it's supported by two or more browser engines. (Note that Chromium-based browsers use the same browser engine and thus support from them counts as a single support.)
code:ts
function hasMultipleImplementations(support: SupportBlock, prefix?: string) {
const hasStableImpl = (
browser: SimpleSupportStatement | SimpleSupportStatement[] | undefined,
) => hasStableImplementation(browser, prefix);
let count = 0;
if (hasStableImpl(support.chrome) || hasStableImpl(support.chrome_android)) {
count += 1;
}
if (
hasStableImpl(support.firefox) ||
hasStableImpl(support.firefox_android)
) {
count += 1;
}
if (hasStableImpl(support.safari) || hasStableImpl(support.safari_ios)) {
count += 1;
}
return count >= 2;
}
Browser Compat Dataのデータはどのように更新するのか
Web APIにまつわるJSONファイルを作成し必要なデータをスキーマに沿ってアップデート
Web IDLファイルの変更履歴(Blame view)からバージョンを特定
src/build.tsにて@webref/*のWeb仕様関連のパッケージにて型定義を生成するためのデータソースとして使用されている
table:table
パッケージ 用途 データ内容
@webref/idl WebIDL仕様の取得 Web APIのインターフェース定義
@webref/css CSS仕様の取得 CSS関連の型定義
@webref/events イベント仕様の取得 イベントとインターフェースのマッピング
@webref/elements HTML要素の取得 HTML要素とインターフェースのマッピング
table:公開されているnpmパッケージ
パッケージ名 説明 対象コンテキスト
@types/web DOMおよびWeb技術の型 Window/メインスレッド
@types/serviceworker Service Workerのグローバルスコープの型 Service Worker
@types/audioworklet Audio Workletのグローバルスコープの型 Audio Worklet
@types/sharedworker Shared Workerのグローバルスコープの型 Shared Worker
@types/webworker Web Workerのグローバルスコープの型 Web Worker
https://gyazo.com/6105e4e37e9bea60d13e8d2487ee8bd9
パッケージの公開フロー
タイムライン
2022-05-24: ChromeでNavigation APIが実装完了
2022-05-31: Microsoft EdgeでNavigation APIが実装完了
2022-10-12: Interop 2023でのフォーカス対象に投票(落選)
https://github.com/web-platform-tests/interop/issues/200
2023-03-29: Navigation APIのTypeScriptサポートはないのか?という質問がIssueに出る
Add support for Navigation API · Issue #1531 · microsoft/TypeScript-DOM-lib-generator · GitHub
2023-09-17: Interop 2024でのフォーカス対象に投票(落選)
https://github.com/web-platform-tests/interop/issues/435
2025-02-14: Interop 2025でNavigation APIがフォーカス対象として選出
https://github.com/web-platform-tests/interop/issues/709#issuecomment-2657325194
2025-12-12: SafariでNavigation APIが実装完了
2026-01-13: FirefoxでNavigation APIが実装完了・Navigation APIがNewly Baseline
2025-02-14: Interop 2026でNavigation APIがフォーカス対象として選出
https://github.com/web-platform-tests/interop/issues/709#issuecomment-2657325194
2026-02-19: DefinitelyTypedからNavigation APIの定義がアップデートされる
https://github.com/DefinitelyTyped/DefinitelyTyped/pull/74546
TypeScript 5.9以下の場合はDefinitelyTypedの定義を使用する
2026-03-07: TypeScript 6.0のRCがリリース
@yamanoku: TypeScript 6.0からDOM APIを最新の情報に追従していく流れで、Navigation APIの型定義がTypeScript 6.0から正式に使えるようになっています🥳
クライアントルーティングライブラリのNavigation API採用の足掛けになるといいなと思っています🙌
https://pbs.twimg.com/media/HCzRAataYAADuYI.jpg
2026-03-23: TypeScript 6.0がリリースし安定版でNavigation APIの型定義が使用できるように
2028-07-13: Navigation APIがBaseline Widely Availableになる予定